package com.dylan.历史.java8.StreamAPI;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

/**
 * Created by Dylan on 2018/7/23.
 */
public class Optional使用 {

    public static void main(String[] args) {
        Optional<String> op = Stream.of("hello").findFirst();
        // 获取,不存在则抛异常
        String str1 = op.get();

        // 判断存在后再获取
        if (op.isPresent()) {
            String str2 = op.get();
        }

        // 如果存在再处理
        Stream.of("hello").findFirst().ifPresent(System.out::println);
        Stream.of("hello").skip(1).findFirst().ifPresent(System.out::println);

        // 将元素添加到其他集合
        List<String> result = new ArrayList<>();
        Stream.of("hello").findFirst().ifPresent(result::add);
        System.out.println(result);

        // 转换/映射
        Optional<Integer> len = Stream.of("hello").findFirst().map(String::length);
        len.ifPresent(System.out::println);

        // 使用默认值
        String value1 = Stream.of("hello").skip(1).findFirst().orElse("default");
        String value2 = Stream.of("hello").skip(1).findFirst().orElseGet(() -> System.getProperty("user.dir"));

        // 创建
        Optional<String> op1 = Optional.of("ankang");
        Optional<String> op2 = Optional.ofNullable(null); // 传入值为null 会调用 Optional.empty()
        Optional<String> op3 = Optional.empty();

        // 组合可选值函数
        Optional<Double> resultDouble = Optional.of(-4.0).flatMap(Optional使用::inverse).flatMap(Optional使用::squareRoot);
        resultDouble.ifPresent(System.out::println);
    }

    private static Optional<Double> inverse(double x) {
        return x < 0 ? Optional.of(-x) : Optional.empty();
    }

    private static Optional<Double> squareRoot(double x) {
        return x < 0 ? Optional.empty() : Optional.of(Math.sqrt(x));
    }
}
